package br.jus.cnj.util;

import java.util.InputMismatchException;

import javax.swing.text.MaskFormatter;

public class CPFUtils {

	/**
	 * <p>
	 * Remove mascara do cpf
	 * </p>
	 * 
	 * @param cpf
	 *            com mascara.
	 * @return <code>00000000000</code> - CPF sem mascara
	 */
	public static String removeMascaraCPF(String cpf) {
		return StringUtils.somenteNumero(cpf);
	}

	/**
	 * <p>
	 * Adiciona mascara ao cpf.
	 * </p>
	 * 
	 * @param cpf
	 *            sem mascara.
	 * @return <code>000.000.000-00</code> - CPF com mascara
	 */
	public static String inserirMascaraCPF(String cpf) throws Exception {
		if ((cpf != null) && (!"".equals(cpf))) {
			MaskFormatter mf = new MaskFormatter("###.###.###-##");
			mf.setValueContainsLiteralCharacters(false);
			cpf = mf.valueToString(cpf);
		}
		return cpf;
	}

	/**
	 * <p>
	 * Verifica se o CPF e valido.
	 * </p>
	 * 
	 * <pre>
	 * CPFUtils.isCPFValido("00000000000")      = false
	 * CPFUtils.isCPFValido("11111111111")      = false
	 * CPFUtils.isCPFValido("22222222222")      = false
	 * CPFUtils.isCPFValido("33333333333")      = false
	 * CPFUtils.isCPFValido("44444444444")      = false
	 * CPFUtils.isCPFValido("55555555555")      = false
	 * CPFUtils.isCPFValido("66666666666")      = false
	 * CPFUtils.isCPFValido("77777777777")      = false
	 * CPFUtils.isCPFValido("88888888888")      = false
	 * CPFUtils.isCPFValido("99999999999")      = false
	 * </pre>
	 * 
	 * @param CPF
	 *            com ou sem mascara.
	 * @return <code>true</code> se o CPF for valido.
	 */
	public static boolean isCPFValido(String CPF) {
		CPF = removeMascaraCPF(CPF);
		if (CPF.equals("00000000000") || CPF.equals("11111111111") || CPF.equals("22222222222") || CPF.equals("33333333333") || CPF.equals("44444444444")
				|| CPF.equals("55555555555") || CPF.equals("66666666666") || CPF.equals("77777777777") || CPF.equals("88888888888") || CPF.equals("99999999999")
				|| (CPF.length() != 11) || CPF.equals(""))
			return (false);

		char digitoCPF10, digitoCPF11;
		int sm, i, r, num, peso;

		try {
			sm = 0;
			peso = 10;
			for (i = 0; i < 9; i++) {
				num = (int) (CPF.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso - 1;
			}

			r = 11 - (sm % 11);
			if ((r == 10) || (r == 11))
				digitoCPF10 = '0';
			else
				digitoCPF10 = (char) (r + 48);

			sm = 0;
			peso = 11;
			for (i = 0; i < 10; i++) {
				num = (int) (CPF.charAt(i) - 48);
				sm = sm + (num * peso);
				peso = peso - 1;
			}

			r = 11 - (sm % 11);
			if ((r == 10) || (r == 11))
				digitoCPF11 = '0';
			else
				digitoCPF11 = (char) (r + 48);
			if ((digitoCPF10 == CPF.charAt(9)) && (digitoCPF11 == CPF.charAt(10)))
				return (true);
			else
				return (false);
		} catch (InputMismatchException erro) {
			return (false);
		}
	}

	// public static void main(String[] args) throws Exception {
	// System.out.println(isCPFValido("736.659.591-87"));
	// }
}
